home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 176-200 / disk_190 / nethack / twee.zoo / fountain.c < prev    next >
C/C++ Source or Header  |  1988-07-22  |  8KB  |  343 lines

  1. /*    SCCS Id: @(#)fountain.c 2.3     88/01/21
  2. /* fountain.c  v 1.4.4 */
  3.  
  4. /*
  5.  * Revision 1.4.4  88/02/11  08:31:00  M. Stephenson
  6.  * Implemented "coins" fixes by woodbury@bme.unc.edu
  7.  * Fixed minor bugs.
  8.  *
  9.  * Revision 1.4.3  87/11/25  19:16:00  M. Stephenson
  10.  * Implemented levitation bug fixes.
  11.  *
  12.  * Revision 1.4.2  87/10/19  11:48:00  M. Stephenson
  13.  * Implementation of KJS bug fixes.
  14.  *
  15.  * Revision 1.4.1  87/05/20  11:53:00  M. Stephenson
  16.  * Implementation of KAA bug fixes.
  17.  *
  18.  * Revision 1.4    87/05/04  17:39:00  M. Stephenson
  19.  * Integration of independent modifications
  20.  *
  21.  * Revision 1.3    87/03/02           Eric Backus
  22.  * Rearranged, and dipfountain added
  23.  *
  24.  * Revision 1.2    87/03/01  13:59:59  gil
  25.  * patches
  26.  *
  27.  * Revision 1.1    87/02/11  15:14:10  gil
  28.  * Initial revision
  29.  *
  30.  */
  31.  
  32. /* Code for drinking from fountains.   */
  33. /* Scott R. Turner, srt@ucla, 10/27/86 */
  34.  
  35. #include "hack.h"
  36.  
  37. extern struct monst *mkmon_at();
  38. extern struct obj *mkobj_at();
  39. extern char genocided[];
  40.  
  41. #ifdef FOUNTAINS
  42. #define somex() ((int)(rand()%(croom->hx-croom->lx+1))+croom->lx)
  43. #define somey() ((int)(rand()%(croom->hy-croom->ly+1))+croom->ly)
  44.  
  45. dowatersnakes() /* Fountain of snakes! */ {
  46.     register int num = rnd(6);
  47.     if (!index(genocided, 'S')) {
  48.  
  49.         pline("Good Lord!  An endless stream of snakes pours forth!");
  50.         while(num-- > 0) (void) mkmon_at('S',u.ux,u.uy);
  51.     } else
  52.         pline("The fountain bubbles furiously for a moment, then calms.");
  53. }
  54.  
  55. dowaterdemon() /* Water demon */ {
  56. register struct monst *mtmp;
  57.  
  58.     if((mtmp = mkmon_at('&',u.ux,u.uy))) {
  59.         pline("You have unleashed a water demon!");
  60.  
  61.     /* Give those on low levels a (slightly) better chance of survival */
  62.         if ( rnd(100) > (80 + dlevel)) {
  63.         pline("Grateful for his release, he grants you a wish!");
  64.         makewish();
  65.         mondied(mtmp);
  66.         }
  67.     }
  68. }
  69.  
  70. dowaternymph() /* Water Nymph */ {
  71.     register struct monst *mtmp;
  72.     if((mtmp = mkmon_at('N',u.ux,u.uy))) {
  73.  
  74.         pline("You have attracted a water nymph!");
  75.         mtmp->msleep = 0;
  76.     } else
  77.         pline("A large bubble rises to the surface and pops.");
  78. }
  79.  
  80. #include    "mkroom.h"
  81.  
  82. dogushforth() /* Gushing forth in this room */ {
  83. register int num = rnd(10);
  84. register xchar mx,my;
  85. register int tryct = 0;
  86. register int uroom = inroom(u.ux, u.uy);
  87. register struct mkroom *croom = &rooms[uroom];
  88. register int madepool = 0;
  89.  
  90.     if(croom->hx < 0 || has_upstairs(croom) ||
  91.        has_dnstairs(croom))  {
  92.         pline("Your thirst is quenched.");
  93.         return;
  94.     }
  95.     while(num--) {
  96.         do {
  97.         if(++tryct > 200)  {
  98.             if(madepool)
  99.             pline("Water gushes forth from the overflowing fountain!");
  100.             else
  101.             pline("Your thirst is quenched.");
  102.             return;
  103.         }
  104.         mx = somex();
  105.         my = somey();
  106.         } while(nexttodoor(mx,my) || !((mx+my)%2) ||
  107.             (mx == u.ux && my == u.uy) ||
  108.             (IS_POOL(RM_TYP(levl[mx][my]))));
  109.  
  110.         /* Put a pool at mx, my */
  111.  
  112.         RM_SET_TYP(levl[mx][my], POOL);
  113.         atl(mx,my,POOL_SYM);
  114.         madepool = 1;
  115.     }
  116.  
  117.     pline("Water gushes forth from the overflowing fountain!");
  118. }
  119.  
  120. dofindgem() /* Find a gem in the sparkling waters. */ {
  121.  
  122.     if (!Blind) pline("You spot a gem in the sparkling waters!");
  123.     mkobj_at('*',u.ux,u.uy);
  124. }
  125.  
  126. dryup(){
  127.     if (!rn2(3) && (RM_TYP(levl[u.ux][u.uy]) == FOUNTAIN)) {
  128.         pline("The fountain dries up!");
  129.         RM_SET_TYP(levl[u.ux][u.uy], ROOM);
  130.         if(Invis) newsym(u.ux, u.uy);
  131.     }
  132. }
  133.  
  134. drinkfountain() {
  135.  
  136.     /* What happens when you drink from a fountain? */
  137.     register int fate = rnd(30);
  138.  
  139.     if(Levitation)  pline("You are floating high above the fountain.");
  140.     else if (fate < 10) {
  141.         pline("The cool draught refreshes you.");
  142.         lesshungry(rnd(10));
  143.     } else {
  144.         switch (fate) {
  145.  
  146.         case 20: /* Foul water */
  147.  
  148.             pline("The water is foul!  You gag and vomit.");
  149.             morehungry(rnd(20)+10);
  150.             if(Sick)  {
  151.                 Sick = 0;
  152.                 pline("What a relief!");
  153.             }
  154.             break;
  155.  
  156.         case 21: /* Poisonous */
  157.  
  158.             pline("The water is contaminated!");
  159.             if (Poison_resistance) {
  160.                pline("Perhaps it is run off from the nearby orange farm.");
  161.                losehp(rnd(4),"unrefrigerated orange juice");
  162.                break;
  163.             }
  164.             losestr(rn1(4,3));
  165.             losehp(rnd(10),"contaminated water");
  166.             break;
  167.  
  168.         case 22: /* Fountain of snakes! */
  169.             dowatersnakes();
  170.             break;
  171.  
  172.         case 23: /* Water demon */
  173.             dowaterdemon();
  174.             break;
  175.  
  176.         case 24: /* Curse an item... */ {
  177.             register struct obj *obj;
  178.  
  179.             pline("This water's no good!");
  180.             morehungry(rnd(20)+10);
  181.             for(obj = invent; obj ; obj = obj->nobj)
  182.                 if (!rn2(5))    obj->cursed++;
  183.             break;
  184.             }
  185.  
  186.         case 25: /* See invisible */
  187.  
  188.             pline("You see an image of someone stalking you.");
  189.             pline("But it disappears.");
  190.             HSee_invisible |= INTRINSIC;
  191.             break;
  192.  
  193.         case 26: /* See Monsters */ {
  194.             register struct monst *mtmp;
  195.  
  196.               if(!fmon) pline("You feel oddly disturbed.");
  197.               else {
  198.                 cls();
  199.                 for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  200.                 if(mtmp->mx > 0)
  201.                     at(mtmp->mx,mtmp->my,mtmp->data->mlet);
  202.                 prme();
  203.                 pline("You sense the presence of monsters.");
  204.                 more();
  205.                 docrt();
  206.               }
  207.             }
  208.             break;
  209.  
  210.         case 27: /* Find a gem in the sparkling waters. */
  211.             dofindgem();
  212.             break;
  213.  
  214.         case 28: /* Water Nymph */
  215.             dowaternymph();
  216.             break;
  217.  
  218.         case 29: /* Scare */ {
  219.             register struct monst *mtmp;
  220.  
  221.             pline("This water gives you bad breath!");
  222.             for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  223.                 mtmp->mflee = 1;
  224.             }
  225.             break;
  226.  
  227.         case 30: /* Gushing forth in this room */
  228.             dogushforth();
  229.             break;
  230.         default:
  231.             break;
  232.         }
  233.     }
  234.     dryup();
  235. }
  236.  
  237. dipfountain(obj)
  238. register struct obj *obj;
  239. {
  240.     register int fate = rnd(30);
  241.  
  242.     if(Levitation)  pline("You are floating high above the fountain.");
  243.     else if(fate<10)
  244.         if(!obj->rustfree &&
  245.             /* Only swords affected here */
  246.             (obj->otyp == LONG_SWORD ||
  247.             obj->otyp == KATANA ||
  248.             obj->otyp == BROAD_SWORD ||
  249.             obj->otyp == SHORT_SWORD ||
  250.             obj->otyp == TWO_HANDED_SWORD)) {
  251.             if(obj->spe > -6) {
  252.                 pline("Your weapon rusts somewhat.");
  253.                 obj->spe--;
  254.             } else pline("Your weapon looks quite rusted.");
  255.         } else pline("Well, it looks wet now.");
  256.     else if(fate<14)
  257.         if(obj->otyp == LONG_SWORD
  258. #ifndef RPH
  259.            && !strcmp(ONAME(obj), "Excalibur")
  260. #endif
  261.         ) {
  262.             /* The lady of the lake acts! - Eric Backus */
  263.             /* Be *REAL* nice to him */
  264.     pline("A murky hand from the depths reaches up to bless the sword.");
  265.     pline("As the hand retreats, the fountain disappears!");
  266. #ifndef RPH
  267.             if(obj->spe < 5) obj->spe = 5;
  268. #else
  269.             /* otherwise +rnd(10) / +5 "Super"sword */
  270.             oname(obj, "Excalibur");
  271. #endif
  272. #ifdef KAA
  273.             obj->dknown = 1;    /* blessed */
  274. #endif
  275.             obj->cursed = 0;
  276.             obj->rustfree = 1;
  277.             RM_SET_TYP(levl[u.ux][u.uy], ROOM);
  278.             if(Invis) newsym(u.ux, u.uy);
  279.             return(0);
  280.         } else pline ("Well, it looks wet now.");
  281.     else {
  282.         switch (fate) {
  283.         case 16: /* Curse the item */
  284.             pline("Well, it looks wet now.");
  285.             obj->cursed = 1;
  286.             break;
  287.         case 17:
  288.         case 18:
  289.         case 19:
  290.         case 20: /* Uncurse the item */
  291.             if(obj->cursed) {
  292.                 pline("The water glows for a moment.");
  293.                 obj->cursed = 0;
  294.             } else {
  295.                 pline("A feeling of loss comes over you.");
  296.             }
  297.             break;
  298.         case 21: /* Water Demon */
  299.             dowaterdemon();
  300.             break;
  301.         case 22: /* Water Nymph */
  302.             dowaternymph();
  303.             break;
  304.         case 23: /* An Endless Stream Of Snakes */
  305.             dowatersnakes();
  306.             break;
  307.         case 24: /* Find a gem */
  308.             dofindgem();
  309.             break;
  310.         case 25: /* Water gushes forth */
  311.             dogushforth();
  312.             break;
  313.         case 26: /* Strange feeling */
  314.             pline("A strange tingling runs up your arm.");
  315.             break;
  316.         case 27: /* Strange feeling */
  317.             pline("You feel a sudden chill.");
  318.             break;
  319.         case 28: /* Strange feeling */
  320.         pline("An urge to take a bath overwhelms you.");
  321.             if (u.ugold > 10) {
  322.                 u.ugold -= somegold()/10;
  323.               pline("You lost some of your gold in the fountain!");
  324.             }
  325.             break;
  326.         case 29: /* You see coins */
  327.  
  328.         /* We make fountains have more coins the closer you are to the
  329.          * surface.  After all, there will have been more people going
  330.          * by.    Just like a shopping mall!  Chris Woodbury  */
  331.  
  332.             mkgold((long)(rnd((MAXLEVEL-dlevel)*2)+5),u.ux,u.uy);
  333.         pline("Far below you, you see coins glistening in the water.");
  334.             break;
  335.         default:
  336.             break;
  337.         }
  338.     }
  339.     dryup();
  340.     return(0);
  341. }
  342. #endif
  343.